//
//  HMSportSportingVC.m
//  BlackHorseLine
//
//  Created by made on 17/3/5.
//  Copyright © 2017年 made. All rights reserved.
//

#import "HMSportSportingVC.h"
#import "HMSportMapVC.h"
#import "UIColor+HMColorAddition.h"
#import "HMSportSpeaker.h"

@interface HMSportSportingVC ()<HMSportMapVCDelegate>
//距离
@property (weak, nonatomic) IBOutlet UILabel *distanceLabel;
//时间
@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
//平均速度
@property (weak, nonatomic) IBOutlet UILabel *speedLabel;
//@property (weak, nonatomic) IBOutlet UIView *containerView;

//地图控制器
@property(nonatomic,strong)HMSportMapVC *mapVC;

//语音播报器
@property(nonatomic,strong)HMSportSpeaker *speaker;

@end

@implementation HMSportSportingVC


- (void)awakeFromNib
{
    [super awakeFromNib];

}


- (void)dealloc
{
    //移除KVO
    [self.mapVC.sportTracking removeObserver:self forKeyPath:@"sportStartLocation"];
}


#pragma mark - KVO
//被观察者的被观察属性行为发生变化
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    NSLog(@"被观察的属性:%@",keyPath);
    //获取新值
    id newValue = change[NSKeyValueChangeNewKey];
    //获取旧值
    id oldValue = change[NSKeyValueChangeOldKey];
    
    //距离
    self.distanceLabel.text = [NSString stringWithFormat:@"%.2f",self.mapVC.sportTracking.totalDistance];
    //时间
    self.timeLabel.text = self.mapVC.sportTracking.totaTimeStr;
    //速度
    self.speedLabel.text = [NSString stringWithFormat:@"%.2f",self.mapVC.sportTracking.avgSpeed];
    
    //开始播报整点距离
    [self.speaker reportDistance:self.mapVC.sportTracking.totalDistance Time:self.mapVC.sportTracking.totalTime Speed:self.mapVC.sportTracking.avgSpeed];
}


- (void)viewDidLoad {
    [super viewDidLoad];
    
    //self.view.backgroundColor = [UIColor greenColor];
    
    //设置地图视图控制器
    [self configMapViewController];
    
    //添加背景渐变颜色
    [self configBackgroundColor];
    
    //运动开始播报
    self.speaker = [[HMSportSpeaker alloc] initWithSportType:self.sportType];
    [self.speaker startSport];
    //NSLog(@"%zd",self.sportType);
}



//背景渐变颜色
- (void)configBackgroundColor
{
    //1.创建渐变(梯度)图层
    CAGradientLayer *gradientLayer = [[CAGradientLayer alloc] init];
    
    //2.layer默认大小是0,需要通过bounds属性和position设置大小和位置
    gradientLayer.bounds = self.view.bounds;
    gradientLayer.position = self.view.center;
    
    //3.设置颜色数组(标识渐变的颜色)
    UIColor *color1 = [UIColor colorWithHex:0x0e1428];
    UIColor *color2 = [UIColor colorWithHex:0x406479];
    UIColor *color3 = [UIColor colorWithHex:0x406578];
    
    //4.数组中的内容一定要是CGColor,否则无法显示渐变效果
    gradientLayer.colors = @[(__bridge id)color1.CGColor,(__bridge id)color2.CGColor,(__bridge id)color3.CGColor];
    
    //5.设置位置数组(表示在什么位置渐变什么颜色),数组中是NSNumber类型
    //屏幕从最顶部到最底部
    gradientLayer.locations = @[@(0),@(0.5),@(1)];
    
    //6.添加渐变图层(使用insert插入最底部,防止遮盖其他子视图),同时设置其他子视图的背景颜色为透明,防止遮盖渐变图层
    [self.view.layer insertSublayer:gradientLayer atIndex:0];
    
    
}


- (void)configMapViewController
{
    //地图的创建操作应该在加载运动监控控制器的时候就要创建,才能实现一进入运动监控控制器就能够更新运动轨迹
    //1.获取storyboard中的控制器
    UIStoryboard *board = [UIStoryboard storyboardWithName:@"Sport" bundle:nil];
    self.mapVC = (HMSportMapVC *)[board instantiateViewControllerWithIdentifier:@"HMSportMapVC"];
    //2.创建地图控制器的运动模型
    self.mapVC.sportTracking = [[HMSportTracking alloc] initWithSportType:self.sportType];
    //3.设置代理
    self.mapVC.delegate = self;
    
    //使用KVO实现监听运动数据的变化
    /**
     第一个参数:self.mapVC  被观察者
     第二个参数:Observer  观察者
     第三个参数:KeyPath  观察的属性
     第四个参数:options 观察的属性的行为  (如果是想要值一改变就通知那么一般使用旧值与新值替换行为)
     第五个参数:context 上下文 一般为nil
     */
    //KVO:观察者属性如果是readonly则表示没有set方法,就不会有赋值操作,所以无法监听
    [self.mapVC.sportTracking addObserver:self forKeyPath:@"sportStartLocation" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
    
    
    
    
//    //1.创建地图控制器
//    HMSportMapVC *mapVC = [[HMSportMapVC alloc] init];
//    //2.将地图控制器添加到当前控制器
//    [self addChildViewController:mapVC];
//    //3.将地图控制器的视图添加到当前视图
//    [self.view addSubview:mapVC.view];
//    mapVC.view.frame = CGRectInset(self.view.frame, 0, 30);
//    //4.添加子控制器
//    [mapVC didMoveToParentViewController:self];
//    //5.创建地图控制器的运动模型
//    mapVC.sportTracking = [[HMSportTracking alloc] initWithSportType:self.sportType];
    
    //获取containerView嵌入的控制器有两种方式
    //第一种方式  通过子控制会拿到(containerView嵌套的控制器会被系统默认添加到containerView的父视图所在的控制器)
//    NSLog(@"%@",self.childViewControllers);
//    
//    //第二种方式  通过响应链获取containView所在的控制器
//    NSLog(@"%@",self.containerView.nextResponder);
//    NSLog(@"%@",self.view.nextResponder);//view的下一个响应链是自己的父视图或者控制器
//
//
//    //containerView嵌套的控制器的视图默认会被添加到containerView的子视图中
//    NSLog(@"%@",self.containerView.subviews);
//    //通过containerView的子视图获取子视图所在的控制器
//    self.mapVC = (HMSportMapVC *)[self.containerView.subviews[0] nextResponder];
//    self.mapVC.sportTracking = [[HMSportTracking alloc] initWithSportType:self.sportType];
}


#pragma mark - 运动状态按钮
- (IBAction)sportStateButtomClick:(UIButton *)sender {
    //运动状态按钮点击,只需要改变运动模型的值即可
    self.mapVC.sportTracking.sportState = sender.tag;
    
    //如果运动状态是结束则dismiss控制器
    if (sender.tag == HMSportStateFinish)
    {
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    else if (sender.tag == HMSportStateContinue) //折叠动画
    {
        [self stateButtonAnimationWithFold:YES];
    }
    else //暂停按钮展开动画
    {
        [self stateButtonAnimationWithFold:NO];
    }
    
    //语音播报运动状态的改变
    [self.speaker sportTypeChanged:sender.tag];
}


//运动状态按钮平移动画:实际开发中如果一个事件既有业务逻辑也有UI动画逻辑,建议将两者区分(封装成两个方法)
//fold:yew 折叠  no:展开
- (void)stateButtonAnimationWithFold:(BOOL)isFold
{
    //1.如果是展开,  (1)暂停按钮隐藏  (2)继续按钮向左移动(自身宽度) (3)结束按钮向右移动
    
    //获取暂停按钮
    UIButton *pauseButton = self.stateButtonArr[2];
    //获取继续按钮
    UIButton *continueButton = self.stateButtonArr[1];
    //获取结束按钮
    UIButton *finishButton = self.stateButtonArr[0];
    
    if (isFold == NO)
    {
        //暂停按钮显示
        pauseButton.hidden = YES;
        //继续按钮向左移动
        self.continueContraint.constant -= continueButton.frame.size.width;
        //结束按钮向左移动
        self.finishContraint.constant += finishButton.frame.size.width;
    }
    else
    {
        //如果是折叠,则需要等动画完成之后再显示暂停按钮
        //暂停按钮显示
        //pauseButton.hidden = NO;
        //继续按钮向右移动
        self.continueContraint.constant += continueButton.frame.size.width;
        //结束按钮向左移动
        self.finishContraint.constant -= finishButton.frame.size.width;
    }
    //layerout动画本质上就是将刷新布局的过程放入动画中
    [UIView animateWithDuration:0.5 animations:^{
        //手动刷新布局
        [self.view layoutIfNeeded];
    } completion:^(BOOL finished) {
        //如果是折叠,则需要等动画完成之后再显示暂停按钮
        if (isFold)
        {
            pauseButton.hidden = NO;
        }
    }];

    

}


#pragma mark - 地图按钮
- (IBAction)mapButtonClick:(UIButton *)sender {
    //1.获取storyboard中的控制器
//    UIStoryboard *board = [UIStoryboard storyboardWithName:@"Sport" bundle:nil];
//    self.mapVC = [board instantiateViewControllerWithIdentifier:@"HMSportMapVC"];
//    //2.创建地图控制器的运动模型
//    self.mapVC.sportTracking = [[HMSportTracking alloc] initWithSportType:self.sportType];
    //3.跳转
    [self presentViewController:self.mapVC animated:YES completion:nil];
    //4.修改指南针的位置与地图按钮一致
    //罗盘的原点位置应该是按钮中心位置,偏移罗盘宽高的一半
    self.mapVC.mapView.compassOrigin = CGPointMake(sender.center.x - (self.mapVC.mapView.compassSize.width * 0.5), sender.center.y - (self.mapVC.mapView.compassSize.height * 0.5));

    //5.设置代理
    //self.mapVC.delegate = self;
    
}



#pragma mark - HMSportMapVCDelegate

- (void)HMsportMapVCDidUpdateLocation:(HMSportTracking *)sportTracking mapVC:(HMSportMapVC *)mapVC
{
    return;
    
    //距离
    self.distanceLabel.text = [NSString stringWithFormat:@"%.2f",sportTracking.totalDistance];
    //时间
    self.timeLabel.text = sportTracking.totaTimeStr;
    //平均速度
    self.speedLabel.text = [NSString stringWithFormat:@"%.2f",sportTracking.avgSpeed];
}


#pragma mark - storyboard segue unwind用法
//要想使用storyboard segue unwind用法必须要满足两个条件
//1.方法返回值一定要是IBAction(表示是storyboard中的方法)  //2.方法的参数一定要是segue本身UIStoryboardSegue
- (IBAction)dismiss:(UIStoryboardSegue *)sender
{
    
}



@end
